/**
 * 
 */
package com.study.thread;

/**
 * @author Administrator
 * @date 2019年4月28日
 */
class Info{
    private String name;
    private String content;
    private boolean flag=true; //标识位，表示生产者是否可以进行生产，true表示可以，false表示不可以。
    
    //问题1： 输出结果会出现（比如：name1:-->content0）,要加上同步操作
    public  synchronized void set(String name,String content)
    {
        if(!flag)//如果不可以进行生产，则对Info对象加锁
        {
            try {
            	//问题2： 重复读取的问题，以及漏读信息的问题（比如上述输出中name9:-->content9重复读取，而name5:-->content5被漏读了）
            	//
                super.wait();   //让拥有Info对象的生产者线程进入等待状态
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        this.setName(name);
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        this.setContent(content);
        flag=false;//修改标志位为false，表示生产者已经完成资源，消费者可以消费。
        System.out.println("生产："+this.getName()+":-->"+this.getContent());
        super.notify();//唤醒消费者进程
    }
    
    public synchronized void get()
    {
        if(flag)
        {
            try {
                super.wait(); //让拥有Info资源的消费者线程进入等待
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //System.out.println(this.getName()+":-->"+this.getContent());
        flag=true;//修改标志位为true，表示消费者拿走资源，生产者可以生产。
        System.out.println("消费："+this.getName()+":-->"+this.getContent());
        super.notify();//唤醒生产者进程。
    }
    
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    
}

class Producer implements Runnable{
    private Info info=null;
    public Producer(Info info)
    {
        this.info=info;
    }
    

    @Override
    public void run() {
        boolean flag=false;
        for(int i=0;i<10;i++)
            if(flag)
            {
                this.info.set("name+"+i, "content+"+i);
                flag=false;
            }
            else
            {
                this.info.set("name-"+i, "content-"+i);
                flag=true;
            }
    }
}

class Consumer implements Runnable{
    private Info info=null;
    public Consumer(Info info)
    {
        this.info=info;
    }
    @Override
    public void run() {
        for(int i=0;i<10;i++)
        {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            this.info.get();
        }
        
    }
}

public class ThreadDeadLock {
    public static void main(String args[])
    {
        Info info=new Info();
        Producer pro=new Producer(info);
        Consumer con=new Consumer(info);
        new Thread(pro).start();
        new Thread(con).start();
    }
    
}
